package controllers

import (
	"encoding/json"
	"errmsg"
	"errors"
	"fmt"
	"github.com/astaxie/beego/logs"
	"github.com/astaxie/beego/validation"
	"regexp"
	"smart_home/api/models"
)

type UseModeController struct {
	BaseController
}

// @Title GetAll
// @Description 使用模式列表
// @router / [get]
func (c *UseModeController) GetAll() {
	var (
		ls   []*models.UseMode
		err  error
		page int
	)

	if page, err = c.GetInt("page", 1); err != nil {
		logs.Error(errmsg.ErrResponseParameter)
		c.Error(errmsg.ErrResponseParameter)
		return
	}

	if ls, err = models.GetAllUseModeByUid(c.User.Id, page); err != nil {
		c.Error(err)
		return
	}

	c.Success(ls)
}

// @Title Get
// @Description 获取使用模式详情
// @param id path false "使用模式id"
// @router /:id [get]
func (c *UseModeController) Get() {
	var (
		id  string
		um  *models.UseMode
		err error
	)

	id = c.GetString(":id")
	if um, err = models.GetUseModeById(id); err != nil {
		c.Error(err)
		return
	}
	if um == nil {
		c.Error(errmsg.ErrResponseNotFound)
		return
	}
	if um.UserId != c.User.Id {
		c.Error(errmsg.ErrResponseAuth)
		return
	}
	c.Success(um)
}

// @Title Post
// @Description 添加使用模式
// @param name 			body true "使用模式名称"
// @param trigger 		body true "触发条件 1手动触发 2 定时触发"
// @param start_time 	body true "开始时间 例子：10:30 定时触发的时候必须填写"
// @param end_time 		body true "结束时间 例子：10:30"
// @param is_push 		body true "是否推送消息 0：不推送 1：推送"
// @param wkocc 		body true "周日至周六循环值，如1000000代表每周日循坏 0000000 代表不循环 当天执行一次"
// @param task 			body true "任务列表 把任务列表数组json_encode后传入"
// @router / [post]
func (c *UseModeController) Post() {
	var (
		um  *models.UseMode
		err error
	)

	um = models.NewUseMode()
	um.UserId = c.User.Id

	logs.Debug("data:", c.Input())

	if err = c.ParseData(um); err != nil {
		logs.Error(err)
		c.Error(errmsg.ErrResponseParameter)
		return
	}

	if err = c.validate(um); err != nil {
		c.Error(err)
		return
	}

	if err = models.AddUseMode(um); err != nil {
		c.Error(err)
		return
	}

	c.Success(nil)
}

func (c *UseModeController) validate(um *models.UseMode) error {
	vali := validation.Validation{}
	vali.Required(um.Name, "name").Message("模式名称不能为空")
	vali.MinSize(um.Name, 2, "name").Message("模式名称长度为2到20个字符")
	vali.MaxSize(um.Name, 20, "name").Message("模式名称长度为2到20个字符")
	vali.Required(um.Trigger, "trigger").Message("触发条件不能为空")
	vali.Range(um.Trigger, models.UM_MANUAL, models.UM_TIMING, "trigger").Message("触发条件的值为1或2")

	if um.Trigger == models.UM_TIMING {
		timeReg := regexp.MustCompile(`^([01][0-9]|2[0-3]):[0-5][0-9]$`)
		vali.Match(um.StartTime, timeReg, "start_time").Message("start_time格式为:10:30")
		//vali.Match(useMode.EndTime, timeReg, "end_time").Message("end_time格式为:10:30")
	}

	vali.Range(um.IsPush, 0, 1, "is_push").Message("is_push值为0或1")
	vali.Required(um.Wkocc, "wkocc").Message("wkocc不能为空")
	wkoccReg := regexp.MustCompile(`^[01]{7}$`)
	vali.Match(um.Wkocc, wkoccReg, "wkocc").Message("wkocc格式错误 由7位0和1组成的字符串")
	if vali.HasErrors() {
		logs.Error("UseModeController error:", vali.Errors[0])
		return vali.Errors[0]
	}

	if um.Trigger == models.UM_TIMING && len(um.StartTime) == 0 {
		err := errors.New("定时触发必须填写开始时间")
		logs.Error("UseModeController error:", err)
		return err
	}

	umtks := []*models.UseModeTasks{}
	if len(um.Task) == 0 {
		// 检测任务列表是否合法
		tks := c.GetString("task")
		if len(tks) == 0 {
			err := errors.New("task不能为空")
			logs.Error("UseModeController error:", err)
			return err
		}
		err := json.Unmarshal([]byte(tks), &umtks)
		if err != nil {
			logs.Error("UseModeController error:", err)
			return errmsg.ErrResponseParameter
		}

		if len(umtks) == 0 {
			err := errors.New("task不能为空")
			logs.Error("UseModeController error:", err)
			return err
		}
	} else {
		umtks = um.Task
	}

	for k, v := range umtks {
		vi := validation.Validation{}
		vi.Range(v.After, 0, 24*60*60, "after").Message("after值错误")
		vi.Required(v.Sta, "sta").Message("sta不能为空")
		vi.Range(v.State, 0, 1, "state").Message("state的值为0或1")
		if vi.HasErrors() {
			logs.Error("UseModeController error:", vi.Errors[0])
			return vi.Errors[0]
		}

		eq, err := models.GetEquipmentBySta(v.Sta, um.UserId)
		if err != nil {
			return err
		}
		if eq == nil {
			err := errors.New(fmt.Sprintf("您没有%s的操作权限", v.Sta))
			logs.Error("UseModeController error:", err)
			return err
		}

		umtks[k].Name = eq.Name
	}

	um.Task = umtks

	return nil
}

// @Title Put
// @Description 修改使用模式
// @param id path false "使用模式id"
// @param name 			body true "使用模式名称"
// @param trigger 		body true "触发条件 1手动触发 2 定时触发"
// @param start_time 	body true "开始时间 例子：10:30 定时触发的时候必须填写"
// @param end_time 		body true "结束时间 例子：10:30"
// @param is_push 		body true "是否推送消息 0：不推送 1：推送"
// @param wkocc 		body true "周日至周六循环值，如1000000代表每周日循坏 0000000 代表不循环 当天执行一次"
// @param task 			body true "任务列表 把任务列表数组json_encode后传入"
// @router /:id [put]
func (c *UseModeController) Put() {
	var (
		id  string
		err error
		um  *models.UseMode
	)

	id = c.GetString(":id")
	if um, err = models.GetUseModeById(id); err != nil {
		c.Error(err)
		return
	}

	logs.Debug("data:", string(c.Ctx.Input.RequestBody))

	if um == nil {
		c.Error(errmsg.ErrResponseFail)
		return
	}
	if um.UserId != c.User.Id {
		c.Error(errmsg.ErrResponseAuth)
		return
	}

	if err = c.ParseData(um); err != nil {
		logs.Error(err)
		c.Error(errmsg.ErrResponseParameter)
		return
	}

	if err = c.validate(um); err != nil {
		c.Error(err)
		return
	}

	if err = models.UpdateUseMode(um); err != nil {
		c.Error(err)
		return
	}

	c.Success(nil)
}

// @Title Delete
// @Description 删除使用模式
// @param id path false "使用模式id"
// @router /:id [delete]
func (c *UseModeController) Delete() {
	var (
		id  string
		err error
		um  *models.UseMode
	)

	id = c.GetString(":id")
	if um , err = models.GetUseModeById(id); err != nil {
		c.Error(err)
		return
	}
	if um == nil {
		c.Error(errmsg.ErrResponseFail)
		return
	}
	if um.UserId != c.User.Id {
		c.Error(errmsg.ErrResponseAuth)
		return
	}

	if err = models.DelUseModeById(id); err != nil {
		c.Error(err)
		return
	}

	c.Success(nil)
}

// @Title Open
// @Description 开启使用模式
// @param id path false "使用模式id"
// @router /open/:id [get]
func (c *UseModeController) Open() {
	var (
		id  string
		err error
		um  *models.UseMode
	)

	id = c.GetString(":id")
	if um , err = models.GetUseModeById(id); err != nil {
		c.Error(err)
		return
	}
	if um == nil {
		c.Error(errmsg.ErrResponseFail)
		return
	}
	if um.UserId != c.User.Id {
		c.Error(errmsg.ErrResponseAuth)
		return
	}

	um.IsActivate = 1
	if err = models.UpdateUseModeStatus(um); err != nil {
		c.Error(err)
		return
	}

	c.Success(nil)
}

// @Title Close
// @Description 开启使用模式
// @param id path false "使用模式id"
// @router /close/:id [get]
func (c *UseModeController) Close() {
	var (
		id  string
		err error
		um  *models.UseMode
	)

	id = c.GetString(":id")
	if um , err = models.GetUseModeById(id); err != nil {
		c.Error(err)
		return
	}
	if um == nil {
		c.Error(errmsg.ErrResponseFail)
		return
	}
	if um.UserId != c.User.Id {
		c.Error(errmsg.ErrResponseAuth)
		return
	}

	if um.Trigger == models.UM_MANUAL {
		c.Error(errors.New("手动触发不能手动关闭"))
		return
	}

	um.IsActivate = 0
	if err = models.UpdateUseModeStatus(um); err != nil {
		c.Error(err)
		return
	}

	c.Success(nil)
}